#include "trajectoire.h"
#include <cstdlib>
#include <iostream>

using namespace std;
Trajectoire::Trajectoire(Vent *vent)
{
  this->vent=vent;
  trajectoire=NULL;
}

Trajectoire::~Trajectoire()
{
  if(trajectoire) delete[] trajectoire;
}

float Trajectoire::myRand(float inf, float sup)
{
  float ratio = (float)(rand())/RAND_MAX;
  return (inf + (sup-inf)*ratio);
}

void Trajectoire::calculerPoint(float &x, float &y, float &z, int t)
{
  float force = 0.0;
  if(vent)  force = vent->getForce();

  x = *(trajectoire + t) + force;//le vent n'a d'influence que sur l'axe x
  y = *(trajectoire + t + duree+1);
  z = *(trajectoire + t + 2*(duree+1));

}

void Trajectoire::_calculerTrajectoire()
{
  //Calcul de la trajectoire à l'aide d'une courbe de Bezier de degre3
  //P(t) = P1 * (1-t)^3 + 3*P2 * t * (1-t)^2  + 3*P3 * t^2 * (1-t) + P4 * t^3
  trajectoire = new float[3*duree + 3];
  for(int i=0; i<=duree; i++)
  {
    if(i >= duree/2)
    {
      float T = (i - (duree/2.0))/(duree/2.0);
      float unMoinsT = 1-T;
      trajectoire[i] =   x4 * unMoinsT * unMoinsT * unMoinsT \
                       +  3 * x5 * T * unMoinsT * unMoinsT\
                       +  3 * x6 * T * T * unMoinsT\
                       + x7 * T * T * T;

      trajectoire[i + (duree+1)] =  y4 * unMoinsT * unMoinsT * unMoinsT \
                              +  3 * y5 * T * unMoinsT * unMoinsT\
                              +  3 * y6 * T * T * unMoinsT\
                              +  y7 * T * T * T;

      trajectoire[i + (2*(duree+1))] =  z4 * unMoinsT * unMoinsT * unMoinsT \
                                +  3 * z5 * T * unMoinsT * unMoinsT\
                                +  3 * z6 * T * T * unMoinsT\
                                + z7 * T * T * T;
    }
    else
    {
      float T = i/(duree/2.0);
      float unMoinsT = 1-T;
      trajectoire[i] =   x1 * unMoinsT * unMoinsT * unMoinsT \
                       +  3 * x2 * T * unMoinsT * unMoinsT\
                       +  3 * x3 * T * T * unMoinsT\
                       + x4 * T * T * T;

      trajectoire[i + duree+1] =  y1 * unMoinsT * unMoinsT * unMoinsT \
                              +  3 * y2 * T * unMoinsT * unMoinsT\
                              +  3 * y3 * T * T * unMoinsT\
                              +  y4 * T * T * T;

      trajectoire[i + (2*(duree+1))] =  z1 * unMoinsT * unMoinsT * unMoinsT \
                                +  3 * z2 * T * unMoinsT * unMoinsT\
                                +  3 * z3 * T * T * unMoinsT\
                                + z4 * T * T * T;
    }

  }
}


TrajectoireSoucoupe1::TrajectoireSoucoupe1(Vent *vent) : Trajectoire(vent)
{
}

TrajectoireSoucoupe1::~TrajectoireSoucoupe1()
{
}

void TrajectoireSoucoupe1::initTrajectoire(int duree)
{
  this->duree=duree;

  //point de depart 
  x1 = myRand(-20.0,20.0);
  y1 = myRand(0.0,20.0);
  z1 = -20.0;

  //point 2
  x2 = myRand(-15.0,15.0);
  y2 = myRand(3.0,18.0);
  z2= -11.0;

  //point3 
  x3 = myRand(-10.0,10.0);
  y3 = myRand(4.0,10.0);
  z3 = -6.0;

  //point4
  x4 = myRand(-8.0,8.0);
  y4 = myRand(7.0,12.0);
  z4 = 0.0;

  //point5
  x5 = myRand(-5.0,5.0);
  y5 = myRand(4.0,8.0);
  z5 = 2.0;

  //point6
  x6 = myRand(0.0,5.0);
  y6 = 4.0;
  z6 = 2.0;

  //point 7 => point d'arrivée
  x7 = 6.0;
  y7 = 1.0;
  z7 = 3.0;
  
  _calculerTrajectoire();

}


TrajectoireSoucoupe2::TrajectoireSoucoupe2(Vent *vent) : Trajectoire(vent)
{
}

TrajectoireSoucoupe2::~TrajectoireSoucoupe2()
{
}

void TrajectoireSoucoupe2::initTrajectoire(int duree)
{
  this->duree=duree;

  //point de depart 
  x1 = myRand(-20.0,-7);
  y1 = myRand(3,20.0);
  z1 = 5.0;

  //point 2
  x2 = myRand(-7.0,0.0);
  y2 = myRand(3.0,4.0);
  z2= 4.0;

  //point3 
  x3 = myRand(-5.0,7.0);
  y3 = myRand(4.0,17.0);
  z3 = 2.0;

  //point4
  x4 = myRand(-8.0,8.0);
  y4 = myRand(7.0,12.0);
  z4 = 0.0;

  //point5
  x5 = myRand(-4.0,0.0);
  y5 = myRand(10.0,12.0);
  z5 = -2.0;

  //point6
  x6 = -3.0;
  y6 = myRand(3.0,4.0);
  z6 = -5.0;

  //point 7 => point d'arrivée
  x7 = 0.0;
  y7 = 2.0;
  z7 = -3.0;
  
  _calculerTrajectoire();



}


